#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2024/8/16 0:59
# @Author  : Yuyun
# @File    : 学生重新排队.py
# @IDE     : PyCharm


"""
题目描述：
n个学生排成一排，学生编号分别是1到n，n为3的整倍数。老师随机抽签决定将所有学生分成m个3人的小组，n=3*m
为了便于同组学生交流，老师决定将小组成员安排到一起，也就是同组成员彼此相连，同组任意两个成员输入描述：之间无其它组的成员。因此老师决定调整队伍，老师每次可以调整任何一名学生到队伍的任意位置，计为调整了一次，
请计算最少调整多少次可以达到目标。
注意：对于小组之间没有顺序要求，同组学生之间没有顺序要求。两行字符串，空格分隔表示不同的学生编号
第一行是学生目前排队情况
第二行是随机抽签分组情况，从左开始每3个元素为一组
n为学生的数量，n的范围为[3，900]，n 一定为3的整倍数第一行和第二行的元素个数一定相同
输出描述：
老师调整学生达到同组彼此相连的最小次数补充说明：
同组相连：同组任意两个成员之间无其它组的成员，比如有两个小组[4 5 6][1 2 3]，以下结果都满足要求
1 2 3 4 5 6
1 3 2 4 5 6
2 3 1 5 6 4
5 6 4 1 2 3
以下结果不满足要求
1 2 4 3 5 6，4与5之间存在其它组的成员3

示例
输入：
7 9 8 5 6 4 2 1 3
7 8 9 4 2 1 3 5 6
输出：
1
说明：
学生目前排队情况：7 9 8 5 6 4 2 1 3
"""


def min_swaps_to_group(current, target_groups):
    n = len(current)
    # 计算每个小组在目标排列中的起始位置
    group_positions = {}
    group_idx = 0
    for i in range(0, n, 3):
        group_positions[tuple(target_groups[i:i + 3])] = group_idx * 3
        group_idx += 1

        # 计算每个位置上的学生与目标位置的“距离”
    swaps = 0
    for i, student in enumerate(current):
        target_group = tuple(sorted([int(c) for c in ''.join(target_groups[i:i + 3]) if c == str(student)]))
        if target_group in group_positions:
            target_pos = group_positions[target_group] + target_groups[target_pos:target_pos + 3].index(str(student))
            # 计算循环距离
            distance = min(abs(target_pos - i), n - abs(target_pos - i))
            swaps += distance

    return swaps


# 示例输入
current = "7 9 8 5 6 4 2 1 3".split()
target_groups = "7 8 9 4 2 1 3 5 6".split()

# 调用函数并打印结果
print(min_swaps_to_group(current, target_groups))